// 为什么javaScript代码会存在栈溢出？

// var a = 2
// function add(b, c){
//     return c + b
// }
// function addAll(b, c){
//     var d = 10
//     var result = add(b, c)
//     return a + result + d
// }
// addAll(3, 6)

// let x = 5
// const y = 6
// x = 7
// y = 9//const声明的变量不可被更改（常量）
// console.log(x, y);

// function a(){
//     let x = 1
//     if(true){
//         //var x = 2
//        let x = 2
//         console.log(x);//2 2(let)
//     }
//     console.log(x); //2 1(let)
// }
// // AO:{
// //     x: undefined > 1 >2
// // }
// a()

// function foo() {
//     var a = 1
//     let b = 2//let是在词法环境中开发一个块级作用域来存放定义的变量
//     {
//       let b = 3
//       var c = 4
//       let d = 5 //内部的let定义的变量会另外开辟作用域并存放置栈顶
//       console.log(a); //1
//       console.log(b); //3
//     }
//     console.log(b); //2
//     console.log(c); //4
//     console.log(d); //undefined
//   }
//   foo()

//   var a = 1
//   let a = 2
//   console.log(a);//error  寻找时会先看let定义的并将1赋值给他，再赋值2，此时报错

let name = '家君'
{
  console.log(name);
  let name = '小李'
}